<--- %%NOBANNER%% --> mn2_ss.sas
 BackForward

/*------------------<--  Start of Description -->--------------------\
| Sample size for two independent means;                             |
|--------------------<--  End of Description -->---------------------|
|--------------------------------------------------------------------|
|--------------<--  Start of Files or Arguments Needed -->-----------|
| Arguments:                                                         |
|   - Required:                                                      |
|     std = standard deviation                                       |
|     y1 = true group 1 mean under null hypothesis                   |
|     min_y2 = smallest possible true group 2 mean                   |
|   - Optional:                                                      |
|     max_y2 = largest possible true mean for group 2                |
|     inc_y2 = increment value for range of y2                       |
|     r = ratio of group 2/group 1 sample size(n2/n1),default=1      |
|     alpha = type 1 error, e.g. .01 or .05, default=.05             |
|     sides = 1 or 2 for 1 or 2 sided test, default=2                |
|     power = desired power, e.g. .80, .90, default=.80              |
|     plot  = 'P' for line printer plot of group 2 sample size vs y2 |
|             'G' for SAS/GRAPH plot of group 2 sample size vs y2    |
|     unit  = units for mean, e.g. mg, lbs., cm, etc.                |
| Output: Sample size per group for true group 1 mean of y1 vs true  |
|         group 2 means ranging from min_y2 to max_y2                |
|---------------<--  End of Files or Arguments Needed -->------------|
|--------------------------------------------------------------------|
|----------------<--  Start of Example and Usage -->-----------------|
| Example: %mn2_ss(alpha=.05,sides=1,y1=0,min_y2=.2,max_y2=3,        |
|                  inc_y2=.1,std=1, power=.9,unit=gals,plot=p);      |
| Usage:   %mn2_ss(ALPHA=.05,SIDES=2,POWER=.80,Y1=.,MIN_Y2=.,        |
|             MAX_Y2=.,INC_Y2=.,R=1,STD=.,PLOT= , UNIT=);            |
| Reference: Bergstralh, EJ.  SAS macros for sample size and power   |
|            calculations.  Proceedings of the 9th annual SAS Users  |
|            Group International Conference.                         |
|            Equation #6.                                            |
\-------------------<--  End of Example and Usage -->---------------*/
%MACRO mn2_ss(ALPHA=.05,SIDES=2,POWER=.80,Y1=.,MIN_Y2=.,
              MAX_Y2=.,INC_Y2=.,R=1,STD=.,PLOT= , UNIT=);
/*--------------------------------------------\
| Author:   Michael Riggs and Eric Bergstralh;|
| Created:  November 16, 1992;                |
| Modified: January 9, 1998;                  |
| Purpose:  Power for two independent means;  |
\--------------------------------------------*/
 OPTIONS MISSING=' ' NOCENTER;
   %LET PLOT=%UPCASE(&PLOT);
 DATA T1;
      ALPHA=&ALPHA;
      SIDES=&SIDES;
      Y1=&Y1;
      MIN_Y2=&MIN_Y2;
      MAX_Y2=&MAX_Y2;
      INC_Y2=&INC_Y2;
      POWER=&POWER;
      R=&R;
      STD=&STD;
    ZALPHA=(PROBIT(1-ALPHA))*(SIDES=1) + (PROBIT(1-ALPHA/2))*(SIDES=2);
    ZBETA=PROBIT(POWER);
    IF MAX_Y2=. THEN DO;
      MAX_Y2=MIN_Y2+1; INC_Y2=MIN_Y2+2;  *NEED 1 EXEC OF DO;
    END;
    TY1=Y1;
    TSTD=STD;
    TR=R;
    DO Y2=MIN_Y2 TO MAX_Y2 BY INC_Y2;
       N=(TSTD**2)*(1+1/TR)*(ZALPHA+ZBETA)**2/(TY1-Y2)**2;
       DF=ceil(N) + TR*ceil(N)  - 2;   
       N1=ceil( n*(df+3)/(df+1) );  *Increase n for t-test 1/9/98;
       n2=n1*tr;         *1/9/98;
       OUTPUT;
     END;
 LABEL Y1="Group 1*Mean (&UNIT)"
       Y2="Group 2*Mean (&UNIT)"
       R='N2/N1*Ratio';
FOOTNOTE1 '   ';
RUN;

 PROC PRINT SPLIT='*';
      ID y1;
      VAR Y2 N1 N2;

 TITLE2
    'SAMPLE SIZE REQUIREMENTS FOR COMPARING TWO MEANS';
 TITLE3
  "Alpha=&alpha, Sides=&sides, STD=&std, Power=&power, Ratio N2/N1=&r ";
 TITle4"Group 1 true mean=&y1(&unit)";
 run;
%IF "&MAX_Y2" NE ""  %THEN %DO;
    %IF &PLOT= P  %THEN %DO;
      PROC PLOT NOLEGEND;
           PLOT N2*Y2/ HAXIS=&MIN_Y2 TO &MAX_Y2 BY &INC_Y2;
       LABEL N2='Sample Size for Group 2'
        Y2="True Group 2 mean(&unit)";
    %END;
    %ELSE %IF &PLOT= G  %THEN %DO;
          PROC GPLOT ;
      PLOT N2*Y2;
      SYMBOL1  Font= v=none i=join l=1;
       LABEL N2='Group 2 Sample Size'
        Y2="True Group 2 mean(&unit)";
      run;
    %END;
    RUN;
%END;
%MEND mn2_ss;